home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / kowin / util / timer11s.lzh / timer.c < prev    next >
C/C++ Source or Header  |  1991-08-27  |  17KB  |  654 lines

  1. /*/ ******************************************************************* /*/
  2. /*/                                    /*/
  3. /*/       TIMER.win  version 1.00     1990 10/23 by 小笠原博之    /*/
  4. /*/                              SPS0783 COR.    /*/
  5. /*/                                    /*/
  6. /*/    v1.10 : 1991 8/5                        /*/
  7. /*/    v1.11 : 1991 8/27                        /*/
  8. /*/                                    /*/
  9. /*/ ******************************************************************* /*/
  10.  
  11. #include    <stdio.h>
  12. #include    <wlib.h>
  13. #include    <parts.h>
  14. #include    "wide.inc"
  15.  
  16. /*#define        DEBUG/**/
  17.  
  18.  
  19. #define        in(x1,y1,x2,y2)        (info->x>=(x1)&&info->y>=(y1)&&info->x<(x2)&&info->y<(y2))
  20.  
  21. /*/
  22. /*    イベント定義
  23. /*/
  24. #define        EVENT    (EventOpenON        \
  25.             |EventRedrawON        \
  26.             |EventCloseON        \
  27.             |EventIntervalON    \
  28.             |EventUserON        \
  29.             |EventKeyON        \
  30.             |EventIconifyON        \
  31.             |EventMouseEnterON    \
  32.             |EventMouseOutON    \
  33.             |EventMouseSwitchON)
  34.  
  35. #define        WINSIZEX    108    /* 小さい時のウィンドウサイズ */
  36. #define        WINSIZEY    24
  37. #define        WINSIZE2X    108    /* 大きい時のウィンドウサイズ */
  38. #define        WINSIZE2Y    98
  39. #define        WIDEONX        (80*6+8)
  40. #define        WIDEONY        (WINSIZE2Y)
  41. #define        WIDEOFFX    (WINSIZE2X)
  42. #define        WIDEOFFY    (WINSIZE2Y)
  43.  
  44. #define        CLX        3    /* Close BOX の位置 */
  45. #define        CLY        4
  46. #define        ICX        3    /* Icon BOX の位置 */
  47. #define        ICY        13
  48.  
  49. #define        OFFX        20    /* 時刻の表示位置 */
  50. #define        OFFY        4
  51. #define        ALMX        88    /* アラームマークの表示位置 */
  52. #define        ALMY        4
  53. #define        TMMX        96    /* タイマーマークの表示位置 */
  54. #define        TMMY        4
  55. #define        SGMX        88    /* 時報マークの表示位置 */
  56. #define        SGMY        12
  57. #define        WIDEX        98    /* 時報マークの表示位置 */
  58. #define        WIDEY        57
  59.  
  60. #define        MDX        98    /* フォント切り替えスイッチの表示位置 */
  61. #define        MDY        13
  62.  
  63. #define        SGSTRX        4    /* シグナルスイッチ */
  64. #define        SGSTRY        28
  65. #define        ALSTRX        4    /* アラームスイッチ */
  66. #define        ALSTRY        42
  67. #define        TMSTRX        4    /* タイマースイッチ */
  68. #define        TMSTRY        56
  69. #define        STLINXX        4    /* ステータスライン */
  70. #define        STLINYY        70
  71. #define        STLINX        4    /* インプットライン */
  72. #define        STLINY        84
  73.  
  74. #define        mPCM    0
  75. #define        mEXEC    1
  76. #define        mBEEP    2
  77.  
  78.  
  79. /*//////////////////////////////////////////////////////////////////////*/
  80. /* グローバル宣言                            */
  81. /*//////////////////////////////////////////////////////////////////////*/
  82.  
  83. /*** function ***/
  84. extern    void    date_get();
  85. extern    int    date_get2();
  86. extern    void    date_get();
  87. extern    int    time_get2();
  88. int        EventExec();
  89.  
  90. extern    int    alarmflag;
  91. extern    int    timerflag;
  92. extern    int    signalflag;
  93. extern    int    alarmtime;
  94. extern    int    timertime;
  95. extern    int    alarmevent;
  96. extern    int    alm;
  97. extern    int    sigmode;
  98.  
  99. extern    Sheet    Alarm_markPattern;
  100. extern    Sheet    Timer_markPattern;
  101. extern    Sheet    Sig_markPattern;
  102.  
  103. extern    Sheet    Close2Pattern;
  104. extern    Sheet    Icon2Pattern;
  105. extern    Sheet    ModePattern;
  106.  
  107. extern    Sheet    Pattern[];
  108.  
  109. /*** heap size ***/
  110. int    WindowHeapSize= 0;
  111.  
  112.  
  113. Sheet        *pat= Pattern;
  114. unsigned char    bstr[20];
  115. int        f= 0/*4*/;
  116. int        iconmode= TRUE;
  117. int        widemode= FALSE;
  118. int        mode= mPCM;
  119. int        pcmsize;
  120. unsigned char    *pcmdata;
  121. unsigned char    pcmfile[70];
  122. unsigned char    pcmname[24];
  123. unsigned char    exeline[256];
  124. unsigned char    alarmstr[10]={ '0','0',':','0','0',':','0','0',0 };
  125. unsigned char    timerstr[10]={ '0','0',':','0','0',':','0','0',0 };
  126. unsigned char    *modestr[3]={
  127.             (unsigned char*)"PCM ",
  128.             (unsigned char*)"Exec",
  129.             (unsigned char*)"Beep"
  130.         };
  131.  
  132. unsigned char    pcminput[80];
  133. unsigned char    exeinput[80];
  134. InputClass    pcmin;
  135. InputClass    exein;
  136.  
  137. int        datemode= 8;
  138. /*
  139.     0    16:43:43
  140.     1    1991/08/05
  141.     2    1991-08-05
  142.     3    91/08/05
  143.     4    91-08-05 16:43:43
  144.     5    1991/08/05 16:43:43
  145.     6    1991-08-05 16:43:43
  146.     7    91/08/05 16:43:43
  147.     8    91-08-05 16:43:43
  148. */
  149.  
  150. /*//////////////////////////////////////////////////////////////////////*/
  151. /* メインルーチン                            */
  152. /*//////////////////////////////////////////////////////////////////////*/
  153. void
  154. WindowMain( argc, argv )
  155. int        argc;
  156. unsigned char    **argv;
  157. {
  158.     WindowID    wp;
  159.     int        x= 2,
  160.             y= 2;
  161.  
  162.     /*/
  163.     /*    オプション解析
  164.     /*/
  165.  
  166.     signalflag= TRUE;
  167.     alarmflag= FALSE;
  168.     timerflag= FALSE;
  169.     alarmevent= TRUE;
  170.     alm= FALSE;
  171.     *pcmfile= '\0';
  172.     *pcmname= '\0';
  173.     *exeline= '\0';
  174.     pcmdata= 0;
  175.     sigmode= FALSE;
  176.  
  177.     argc= AnalyzeArgs( argc, argv, &x, &y, 0, 0 );
  178.     while( --argc ){
  179.         if( **++argv == '-' ){
  180.             switch( *++*argv ){
  181.             case 'f': /* font */
  182.                 f= atoi2( *argv+1 );
  183.                 break;
  184.             case 's': /* signal off */
  185.                 signalflag= FALSE;
  186.                 break;
  187.             case 'b': /* signal mode */
  188.                 sigmode= TRUE;
  189.                 break;
  190.             case 'm': /* exec mode */
  191.                 mode= atoi2( *argv+1 );
  192.                 break;
  193.             case 'e': /* exec file */
  194.                 strcpy( exeline, *argv+1 );
  195.                 break;
  196.             case 'd': /* send format */
  197.                 datemode= atoi2( *argv+1 );
  198.                 break;
  199.             case 'a': /* alarm time */    /* 隠しスイッチ扱い */
  200.                 strncpy( alarmstr, *argv+1, 8 );
  201.                 alarmtime=TIMEBCD( TIMECNV( alarmstr ) );
  202.                 alarmflag= TRUE;
  203.             }
  204.         }else
  205.             strcpy( pcmfile, *argv );
  206.     }
  207.     if( f == 9 )    /* 隠しフォント */
  208.         pat= &Pattern[5*11];
  209.     else
  210.         pat= &Pattern[f*11];
  211.  
  212.     /*/
  213.     /*    ウィンドウ設定
  214.     /*/
  215.  
  216.     wp = WindowSimpleOpen( x, y, WINSIZEX, WINSIZEY, NULL, EventExec );
  217.     WindowSetEventAttr( wp, EVENT );
  218. }
  219. /*
  220.      /  00:00:00 ♪ゥ
  221.     signal mode PCM
  222.     alarm  00:00:00
  223.     timer  00:00:00
  224.     beep.pcm
  225. */
  226. /*//////////////////////////////////////////////////////////////////////*/
  227. /* イベント処理ルーチン                            */
  228. /*//////////////////////////////////////////////////////////////////////*/
  229. EventExec( wp, info )
  230. WindowID    wp;
  231. EventInfo    *info;
  232. {
  233.     int        x;
  234.     unsigned char    str[20];
  235.     DrawBuf        buf[50];
  236.  
  237.     switch( info->option ){
  238.         case EventOpen:
  239.             if( *pcmfile ){
  240.                 pcmload();
  241.                 mode= mPCM;
  242.             }
  243.             InputSet( &pcmin, STLINX, STLINY, (char*)pcminput, 80, 9, 12 );
  244.             InputSet( &exein, STLINX, STLINY, (char*)exeinput, 80, 9, 12 );
  245.             *pcminput= '\0';
  246.             *exeinput= '\0';
  247.             WindowRedraw( wp );
  248.             return    TRUE;
  249.  
  250.         case EventRedraw:    {
  251.             DrawBuf    *bp= buf;
  252.             DrawSetClear( bp++, 1 );
  253.             DrawSetPut( bp++, CLX, CLY, &Close2Pattern );
  254.             DrawSetPut( bp++, ICX, ICY, &Icon2Pattern );
  255.             DrawSetLine( bp++, OFFX-4, OFFY-1, OFFX+8*8+2, OFFY+16, ShadowDown, OptionShadow );
  256.             time_get( str );
  257.             if( f<5 || f == 9 ){
  258.                 int    i;
  259.                 unsigned char    *ptr= str;
  260.                 unsigned char    *ptr2=bstr;
  261.                 for( i=0 ; i<8 ; i++ )
  262.                     DrawSetPut( bp++, i*8+OFFX, OFFY,&pat[(*ptr2++=*ptr++) -'0'] );
  263.             }else
  264.                 DrawSetSymbol( bp++, OFFX, OFFY, (char*)str, 9, 16 );
  265.             bp+= markset( bp, 0 );
  266.             DrawSetPut( bp++, MDX, MDY, &ModePattern );
  267.             DrawSetLine( bp++, 1, 25, WINSIZE2X-1, 26, ShadowDown, OptionShadow );
  268.             DrawSetSymbol( bp++, SGSTRX, SGSTRY, "signal mode", 9, 12 );
  269.             DrawSetSymbol( bp++, SGSTRX+72, SGSTRY, (char*)modestr[mode], 9|4, 12 );
  270.             DrawSetLine( bp++, SGSTRX-2, SGSTRY, SGSTRX+36, SGSTRY+12, ShadowUp, OptionShadow );
  271.             DrawSetLine( bp++, SGSTRX+40, SGSTRY, SGSTRX+66, SGSTRY+12, ShadowUp, OptionShadow );
  272.             DrawSetSymbol( bp++, ALSTRX+3, ALSTRY, "alarm", 9, 12 );
  273.             DrawSetSymbol( bp++, ALSTRX+44, ALSTRY, (char*)alarmstr, 9, 12 );
  274.             DrawSetLine( bp++, ALSTRX-2, ALSTRY, ALSTRX+36, ALSTRY+12, ShadowUp, OptionShadow );
  275.             DrawSetSymbol( bp++, TMSTRX+3, TMSTRY, "timer", 9, 12 );
  276.             DrawSetSymbol( bp++, TMSTRX+44, TMSTRY, timerflag ? "running" : (char*)timerstr, 9, 12 );
  277.             DrawSetLine( bp++, TMSTRX-2, TMSTRY, TMSTRX+36, TMSTRY+12, ShadowUp, OptionShadow );
  278.             DrawSetLine( bp++, ALSTRX+43, ALSTRY+13, WINSIZE2X-12, ALSTRY+13, 0, OptionLine );
  279.             DrawSetPut( bp++, WIDEX, WIDEY, &WidePattern );
  280.             DrawSetSymbol( bp++, WINSIZE2X+20, 32,
  281.         "Timer.win Version 1.11  1991 by COR.", 9|4, 16 );
  282.             bp+= stline( bp );
  283.             WindowDraw( wp, buf, bp-buf );
  284.             return    TRUE;
  285.         }
  286.  
  287.         case EventClose:
  288.             if( pcmdata )
  289.                 MFREE( pcmdata );
  290.             WindowClose( wp );
  291.             WindowConnectionClose();
  292.             return    TRUE;
  293.  
  294.         case EventInterval:    {
  295.             int            a;
  296.             extern    unsigned char    pii[],
  297.                         poon[];
  298.             if( a=time_get2( str ) ){
  299.                 if( f < 5 || f == 9 ){
  300.                     int        i= 0,
  301.                             x= OFFX;
  302.                     unsigned char    *ptr= str;
  303.                     unsigned char    *ptr2=bstr;
  304.                     DrawBuf        *bptr=buf;
  305.                     for(; *ptr ; ptr++, ptr2++, x+=8 ){
  306.                         if( *ptr2 != *ptr ){
  307.                             DrawSetPut( bptr++, x, OFFY, &pat[(*ptr2= *ptr) -'0'] );
  308.                             i++;
  309.                         }
  310.                     }
  311.                     WindowDraw( wp, buf, i );
  312.                 }else{
  313.                     DrawSetSymbol( buf, OFFX, OFFY, (char*)str, 9, 16 );
  314.                     WindowDraw( wp, buf, 1 );
  315.                 }
  316.                 if( a>1 )
  317.                     switch( a ){
  318.                         case 2: /* pii!        */
  319.                             ADPCMOUT( pii, 4*256+3, 2000 );
  320.                             break;
  321.                         case 4: /* poon!    */
  322.                             ADPCMOUT( poon, 4*256+3, 7000 );
  323.                             break;
  324.                         case 5: /* bon bon */
  325.                             ADPCMMOD( 0 );
  326.                             ADPCMOUT( poon, 1*256+3, 7000 );
  327.                             break;
  328.                         case 3: /* alarm    */
  329.                             switch( mode ){
  330.                             case mPCM:
  331.                                 if( pcmdata ){
  332.                                     ADPCMOUT( pcmdata, 4*256+3, pcmsize );
  333. #ifdef    DEBUG
  334.                                     puts("deden");
  335. #endif
  336.                                 }
  337.                                 break;
  338.                             case mEXEC:
  339.                                 progexec();
  340.                                 break;
  341.                             case mBEEP:
  342.                                 B_PUTC(7);
  343.                             }
  344.                             if( alm )
  345.                                 WindowRedraw( wp );
  346.                     }
  347.                 return    TRUE;
  348.             }
  349.             return    FALSE;
  350.         }
  351.         case EventMouseEnter:
  352.         case EventMouseOut:
  353.             if( mode != mBEEP )
  354.                 WindowDraw( wp, buf, InputSetCursorVisible( buf, mode == mPCM ? &pcmin : &exein, info->option == EventMouseEnter ) );
  355.             return    TRUE;
  356.         case EventIconify:
  357.             goto    iconbox;
  358.         case EventMouseSwitch:
  359.             if( info->LeftON ){
  360.                 if( in( CLX, CLY, CLX+8, CLY+8 ) ){
  361.             /*/ close box /*/
  362.                     if( pcmdata ){
  363.                         MFREE( pcmdata );
  364.                         pcmdata = 0;
  365.                     }
  366.                     WindowSendSignal( WindowProcessID, SignalKill, 0 );
  367.                     return    TRUE;
  368.                 }else if( in( ICX, ICY, ICX+8, ICY+8 ) ){
  369.             /*/ icon box /*/
  370.                     int    x,y;
  371.                 iconbox:
  372.                     WindowGetPosition( wp, &x, &y );
  373.                     if( iconmode = !iconmode )
  374.                         WindowResize( wp, x, y, WINSIZEX, WINSIZEY );
  375.                     else
  376.                         WindowResize( wp, x, y, WINSIZE2X, WINSIZE2Y );
  377.                     widemode= FALSE;
  378.                     return    TRUE;
  379.                 }else if( in( MDX, MDY, MDX+8, MDY+6 ) ){
  380.             /*/ font change box /*/
  381.                     if( ++f > 5 )
  382.                         f= 0;
  383.                     pat= &Pattern[f*11];
  384.                     WindowRedraw( wp );
  385.                     return    TRUE;
  386.                 }else if( in( SGSTRX-2, SGSTRY, SGSTRX+36, SGSTRY+12 ) ){
  387.             /*/ signal /*/
  388.                     signalflag = !signalflag;
  389.                     WindowDraw( wp, buf, markset( buf, 1 ) );
  390.                     return    TRUE;
  391.                 }else if( in( SGSTRX+40, SGSTRY, SGSTRX+66, SGSTRY+12 ) ){
  392.             /*/ mode /*/
  393.                     if( ++mode > mBEEP )
  394.                         mode= mPCM;
  395.                     DrawSetSymbol( buf, SGSTRX+72, SGSTRY, (char*)modestr[mode], 9|4, 12 );
  396.                     WindowDraw( wp, buf, 1+stline(buf+1) );
  397.                     return    TRUE;
  398.                 }else if( in( ALSTRX-2, ALSTRY, ALSTRX+36, ALSTRY+12 ) ){
  399.             /*/ alarm /*/
  400.                     alarmflag = !alarmflag;
  401.                     WindowDraw( wp, buf, markset( buf, 1 ) );
  402.                     return    TRUE;
  403.                 }else if( in( TMSTRX-2, TMSTRY, TMSTRX+36, TMSTRY+12 ) ){
  404.             /*/ timer /*/
  405.                     timerflag = !timerflag;
  406.                     if( timerflag ){
  407.                         int    time= TIMECNV( timerstr );
  408.                         int    time2= TIMEBIN(TIMEGET());
  409.                         int    h2,m2,s2;
  410.                         s2= time & 0xff;
  411.                         m2= (time>>8) & 0xff;
  412.                         h2= (time>>16) & 0xff;
  413.                         s2= (time2 & 0xff) + s2;
  414.                         if( s2>=60 ){
  415.                             s2-=60;
  416.                             m2++;
  417.                         }
  418.                         m2= ((time2>>8) & 0xff) + m2;
  419.                         if( m2>=60 ){
  420.                             m2-=60;
  421.                             h2++;
  422.                         }
  423.                         h2= ((time2>>16) & 0xff) + h2;
  424.                         timertime= TIMEBCD( (h2<<16)+(m2<<8)+s2 );
  425. #ifdef    DEBUG
  426.                         {unsigned char buf[80];
  427.                         TIMEASC( (h2<<16)+(m2<<8)+s2, buf );
  428.                         puts( buf );
  429.                         }
  430. #endif
  431.                     }
  432.                     DrawSetSymbol( buf, TMSTRX+44, TMSTRY, timerflag ? "running " : (char*)timerstr, 9, 12 );
  433.                     WindowDraw( wp, buf, 1+markset( buf+1, 1 ) );
  434.                     return    TRUE;
  435.                 }else if( in(  OFFX-4, OFFY-1, OFFX+8*8+2, OFFY+16 ) ){
  436.                     unsigned char    datebuf[40],
  437.                             timebuf[20];
  438.                     if( datemode )
  439.                         date_get( datebuf, (datemode-1)& 3 );
  440.                     time_get( timebuf );
  441.                     if( datemode >= 5 ){
  442.                         strcat( datebuf, " " );
  443.                         strcat( datebuf, timebuf );
  444.                     }
  445.                     SendData( wp, info, UserString, datebuf );
  446.                     return    TRUE;
  447.                 }else if( in( WIDEX, WIDEY, WIDEX+8, WIDEY+10 ) ){
  448.                     int    x,y;
  449.                     WindowGetPosition( wp, &x, &y );
  450.                     if( widemode = !widemode )
  451.                         WindowResize( wp, x, y, WIDEONX, WIDEONY );
  452.                     else
  453.                         WindowResize( wp, x, y, WIDEOFFX, WIDEOFFY );
  454.                     return    TRUE;
  455.                 }
  456.             }
  457.             if( in( ALSTRX+44, ALSTRY, ALSTRX+44+48, ALSTRY+12 ) ){
  458.                 timechange( ALSTRX+44, ALSTRY, alarmstr, info );
  459.                 DrawSetSymbol( buf, ALSTRX+44, ALSTRY, (char*)alarmstr, 9, 12 );
  460.                 WindowDraw( wp, buf, 1 );
  461.                 alarmtime=TIMEBCD( TIMECNV( alarmstr ) );
  462.                 return    TRUE;
  463.             }else if( timerflag == FALSE && in( TMSTRX+44, TMSTRY, TMSTRX+44+48, TMSTRY+12 ) ){
  464.                 timechange( TMSTRX+44, TMSTRY, timerstr, info );
  465.                 DrawSetSymbol( buf, TMSTRX+44, TMSTRY, (char*)timerstr, 9, 12 );
  466.                 WindowDraw( wp, buf, 1 );
  467.                 return    TRUE;
  468.             }
  469.             if( info->LeftON ){
  470.                 WindowMoveOperation( wp, info );
  471.                 return    TRUE;
  472.             }
  473.             break;
  474.         case EventUser:
  475.             switch( info->ComData ){
  476.                 unsigned char    *p= info->ComBuffer;
  477.             case UserPaste:
  478.                 if( mode != mBEEP ){
  479.                     while( *p ){
  480.                         info->option= EventKey;
  481.                         info->KeyCode= *p++;
  482.                         WindowSendEvent( wp, info );
  483.                     }
  484.                 }
  485.                 break;
  486.             case UserStrings:
  487.                 p= *(unsigned char**)p;
  488.             case UserString:
  489.                 if( mode != mBEEP ){
  490.                     strcpy( mode ? exeline : pcmfile, p );
  491.                     if( mode == mPCM )
  492.                         pcmload();
  493.                     WindowDraw( wp, buf, stline( buf ) );
  494.                 }
  495.                 break;
  496.             case 258: /* alarm time */
  497.                 strcpy( alarmstr, info->ComBuffer );
  498.                 alarmflag= TRUE;
  499.                 WindowRedraw( wp );
  500.                 break;
  501.             case 259: /* mode set */
  502.                 mode= atoi2( info->ComBuffer );
  503.                 WindowRedraw( wp );
  504.                 break;
  505.             }
  506.             return    TRUE;
  507.         case EventKey:
  508.             if( mode!=mBEEP ){
  509.                 if( info->KeyCode == '\r' ){
  510.                     if( mode == mPCM ){
  511.                         strcpy( pcmfile, pcminput );
  512.                         pcmload();
  513.                     }else{
  514.                         strcpy( exeline, exeinput );
  515.                     }
  516.                     WindowDraw( wp, buf, stline( buf ) );
  517.                 }else{
  518.                     WindowDraw( wp, buf, InputKey( buf, mode==mPCM? &pcmin : &exein , info->KeyCode, info->ShiftStat ) );
  519.                 }
  520.             }
  521.             return    TRUE;
  522.     }
  523.     return    FALSE;
  524. }
  525.  
  526.  
  527. markset( buf, flag )
  528. DrawBuf    *buf;
  529. int    flag;
  530. {
  531.     int    i= 0;
  532.     if( flag ){
  533.         DrawSetSymbol( buf++, ALMX, ALMY, "  ", 9, 16 );
  534.         DrawSetPut( buf++, MDX, MDY, &ModePattern );
  535.         i= 2;
  536.     }
  537.     if( alarmflag ){
  538.         DrawSetPut( buf++, ALMX, ALMY, &Alarm_markPattern );
  539.         i++;
  540.     }
  541.     if( timerflag ){
  542.         DrawSetPut( buf++, TMMX, TMMY, &Timer_markPattern );
  543.         i++;
  544.     }
  545.     if( signalflag ){
  546.         DrawSetPut( buf++, SGMX, SGMY, &Sig_markPattern );
  547.         i++;
  548.     }
  549.     return    i;
  550. }
  551.  
  552. timechange( x, y, str, info )
  553. int        x,
  554.         y;
  555. unsigned char    *str;
  556. EventInfo    *info;
  557. {
  558.     static unsigned char    Max[]= { '2', '9', 0, '5', '9', 0, '5', '9' };
  559.     int    xp= (info->x - x)/6;
  560.     if( xp >= 0 && xp <= 7 && Max[xp] ){
  561.         if( info->LeftON ){
  562.             if( ++str[xp] > Max[xp] )
  563.                 str[xp]= '0';
  564.         }else if( info->RightON ){
  565.             if( --str[xp] < '0' )
  566.                 str[xp]= Max[xp];
  567.         }
  568.     }
  569.     if( str[0]=='2' && str[1] > '3' ){
  570.         if( xp == 0 )
  571.             str[0]= info->LeftON ? '0' : '1';
  572.         else
  573.             str[1]= info->LeftON ? '0' : '3';
  574.     }
  575. }
  576.  
  577. stline( buf )
  578. DrawBuf    *buf;
  579. {
  580.     DrawBuf    *bp= buf;
  581.     DrawSetLine( bp++, STLINXX-1, STLINYY, STLINXX+80*6+3, STLINYY+32, 1, OptionFill );
  582.     if( mode != mBEEP ){
  583.         unsigned char    *p=(mode == mPCM ? pcmname : exeline); 
  584.         InputSetCursorVisible( 0, (mode == mPCM ? &pcmin : &exein ), FALSE );
  585.         if( *p == '\0' )
  586.             p= (unsigned char*)"<未設定>";
  587.         DrawSetLine( bp++, STLINXX-1, STLINYY+13, STLINXX+80*6+1/*WINSIZE2X-3*/, STLINYY+13, 0,OptionLine);
  588.         DrawSetSymbol( bp++, STLINXX, STLINYY, (char*)p, 9, 12 );
  589.         bp+= InputSetDraw( bp, mode == mPCM ? &pcmin : &exein );
  590.         bp+= InputSetCursorVisible( bp, (mode == mPCM ? &pcmin : &exein ), TRUE );
  591.     }
  592.     return    bp-buf;
  593. }
  594.  
  595. pcmload()
  596. {
  597.     int    fn;
  598.  
  599.     if( !strchr( pcmfile, '.' ) )
  600.         strcat( pcmfile, ".pcm" );
  601.     if( (fn=OPEN( pcmfile, 0 ))>=0 ){
  602.         stcgfn( pcmname, pcmfile );
  603.         if( pcmdata ){
  604.             MFREE( pcmdata );
  605.             pcmdata = 0;
  606.         }
  607.         pcmsize=SEEK( fn, 0, 2 );
  608.         SEEK( fn, 0, 0 );
  609.         if( (int)(pcmdata=(unsigned char*)MALLOC( pcmsize ) ) >= 0 ){
  610.             READ( fn, pcmdata, pcmsize );
  611. #ifdef    DEBUG
  612.             puts("read");
  613. #endif
  614.         }else{
  615.             pcmdata= 0;
  616.             *pcmname= '\0';
  617.         }
  618. #ifdef    DEBUG
  619.         printf("%d-%d\n", pcmdata, pcmsize );
  620. #endif
  621.         CLOSE( fn );
  622.     }
  623.  
  624. }
  625.  
  626. progexec()
  627. {
  628.     unsigned char    *ptr= exeline,
  629.             *p,
  630.             buf[256];
  631.     int        runflag= FALSE,
  632.             exemode= 0x3000000;
  633. back:
  634.     for( p= buf ; *ptr && *ptr != ' ' ; *p++= *ptr++ );
  635.     *p= '\0';
  636.     if( *ptr )
  637.         ptr++;
  638.     if( !strcmpi( buf, "run" ) ){
  639.         runflag= TRUE;
  640.         goto    back;
  641.     }
  642.     if( p= (unsigned char*)strchr( buf, '.' ) ){
  643.         if( strcmpi( p, ".win" ) )
  644.             exemode= 0;
  645.     }else
  646.         strcat( buf, ".win" );
  647.     if( runflag )
  648.         WindowScreenQuit();
  649.     WindowLoadExec( (char*)(exemode+buf), (char*)ptr, 0, 0 );
  650.     if( runflag )
  651.         WindowScreenInit();
  652. }
  653.  
  654.